/**
 * 观察者模式
 */
//  定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
//  警察称之为观察者（Observer）
//  张三称之为被观察者（Observable，可观察的）
//  警察观察张三的这个行为称之为订阅（subscribe），或者注册（register）
//  张三违法后，警察抓捕张三的行动称之为响应（update）

// 观察者
interface Observer {
    update(event: string): void;
}
// 被观察者
class Observable {
    private observers: Set<Observer> = new Set();
    addObserver(observer: Observer) {
        this.observers.add(observer);
    }
    removeObserver(observer: Observer) {
        this.observers.delete(observer);
    }
    notifyObservers(event: string) {
        this.observers.forEach(observer => {
            observer.update(event);
        });
    }
}
// 警察属于观察者：
class PoliceObserver implements Observer {
    update(event: string) {
        console.log('警察收到消息，罪犯在' + event);
    }
}
// 罪犯属于被观察者：
class CriminalObservable extends Observable {
    crime(event: string) {
        console.log('罪犯正在' + event);
        this.notifyObservers(event);
    }
}

const zhangSan = new CriminalObservable();
const police1 = new PoliceObserver();
const police2 = new PoliceObserver();
const police3 = new PoliceObserver();
zhangSan.addObserver(police1);
zhangSan.addObserver(police2);
zhangSan.addObserver(police3);
zhangSan.crime('放狗咬人');
